
/**
 * 执行上下文的创建
     创建执行上下文又可以分为两个阶段: 1. 创建阶段 2. 执行阶段
      1. 创建阶段
        在创建阶段，JavaScript引擎会创建LexicalEnvironment(词法环境)组件，VariableEnvironment(变量环境)组件以及this绑定(在全局上下文中，this指向全局对象。在函数执行上下文中，this取决与函数在哪里被调用。)
      2.执行阶段
        在执行阶段，会完成对所有变量的分配，代码也会被最终执行。执行上下文的代码会被分成两个阶段：
          1)进入执行上下文 2)代码执行
 */

// 执行上下文(环境)
export class ExecutionContext {
  constructor(realm, lexicalEnvironment, variableEnvironment){
    //词法环境LexicalEnvironment
    this.lexicalEnvironment = variableEnvironment || lexicalEnvironment
    // var变量存储环境
    this.variableEnvironment = variableEnvironment
    // object,object原型环境
    // this.realm = {
    //   global:{},
    //   Object:{},
    //   Object_prototype:{}
    // }
    this.realm = realm
  }
  
}

// 运行时JS引擎会创建Reference--所有对象属性的访问等涉及到
export class Reference{
  constructor(object, property){
    this.object = object
    this.property = property
  }

  set(value){
    this.object[this.property] = value
  }

  get(){
    return this.object[this.property]
  }
}

// Object,Object原型环境
export class Realm{
  constructor(){
    this.global = new Map(),
    this.Object = new Map(),
    this.Object.call = function(){

    }
    this.Object_prototype = new Map()
  }
}

// Environment Record环境记录(存储变量和函数声明的实际位置)和对外部环境的引用(可以访问其外部词法环境)
export class EnvironmentRecord{
  constructor(){
    this.thisValue
    this.variables = new Map();
    this.outer = null;
  }
}


